home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prwfile.c < prev    next >
C/C++ Source or Header  |  1995-05-12  |  5KB  |  225 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #include "prtrans.h"
  6.  
  7. #if !defined(__MAIN_C__)
  8. #define main    main_prwfile
  9. #endif
  10.  
  11. #if defined(__MAIN_C__)
  12. unsigned char buffer[256];
  13. #else
  14. extern unsigned char buffer[];
  15. #endif
  16.  
  17. int main(int argc, char **argv);
  18.  
  19. int
  20. main(int argc, char **argv)
  21. {
  22.   FILE *file = stdout;
  23.   int device = 8;
  24.   int byte;
  25.   char **parameters = argv;
  26.   char *remotefile;
  27.   char *localfile;
  28.   char *portspecified = NULL;
  29.   char *prg = "prwfile.prg"; /* loader program file name */
  30.   int specified_remotefile = 0;
  31.   baseaddr = portaddr[DEFAULT_PORT];
  32.  
  33.   while (*++parameters && **parameters == '-') { /* check for options */
  34.     if (parameters[0][1] == '-') { /* "--" ends options */
  35.       parameters++;
  36.       break;
  37.     }
  38.  
  39.     switch (parameters[0][1]) {
  40.     case 'd':
  41.       device = strtoul (*++parameters, NULL, 0);
  42.  
  43.       if (device > 15) {
  44.     fprintf (stderr, "%s: Illegal device number specified.\n", *argv);
  45.     return 1;
  46.       }
  47.  
  48.       break;
  49.  
  50.     case 'l':
  51.       prg = *++parameters;
  52.       break;
  53.  
  54.     case 'p':
  55.       baseaddr = strtoul (*++parameters, NULL, 16);
  56.  
  57.       if (baseaddr > 3) {
  58.     fprintf (stderr, "%s: The printer port number must be between 0 and 3.\n",
  59.              *argv);
  60.     return 1;
  61.       }
  62.  
  63.       portspecified = *parameters;
  64.       baseaddr = portaddr[baseaddr];
  65.       break;
  66.  
  67.     case '?':
  68.     case 'h':
  69.     Usage:
  70.       fprintf (stderr, "%s: Writes a local file to a file on a remote "
  71.                "computer.\n\n", *argv);
  72.       fprintf (stderr, "Usage: %s [options] filename [remote filename]\n",
  73.                *argv);
  74.       fprintf (stderr, "Options:\n\t"
  75.              "-d device\t"
  76.                  "Specify the device number (0-15)\n\t"
  77.              "-l filename\t"
  78.                  "Specify the filename of the client program\n\t"
  79.              "-p port\t"
  80.                  "Specify the printer port (0 to 3)\n");
  81.       fprintf (stderr, "The remote filename is converted to PETSCII.\n");
  82.  
  83.       return 1;
  84.  
  85.     default:
  86.       fprintf (stderr, "%s: Illegal option `%s'.\n", *argv, *parameters);
  87.       goto Usage;
  88.     }
  89.   }
  90.  
  91.   if (!*parameters) goto Usage;
  92.  
  93.   localfile = *parameters++;
  94.   remotefile = strdup(localfile);
  95.  
  96.   if (*parameters) {
  97.     remotefile = *parameters++;
  98.     specified_remotefile = 1;
  99.   }
  100.   ascii2petscii(remotefile);
  101.  
  102.   if (!specified_remotefile && localfile[1] == ':') {
  103.     localfile += 2;    /* strip 0: or 1: from local filename */
  104.   }
  105.   if (strcmp(localfile, "-") == 0) {
  106.     file = stdout;
  107.   } else if (!(file = fopen(localfile, "rb"))) {
  108.     fprintf (stderr, "%s: Could not open the file `%s'.\n", *argv,
  109.                localfile);
  110.     return 1;
  111.   }
  112.  
  113.   {
  114.     int addr;
  115.  
  116.     FILE *f = fopen(prg, "r");
  117.     if (f == NULL) {
  118.       fprintf (stderr, "%s: Cannot find %s to download\n", *argv, prg);
  119.       return 1;
  120.     }
  121.  
  122.     addr = fgetc(f);
  123.     addr |= fgetc(f) << 8;
  124.     fclose(f);
  125.  
  126. #if defined(__MAIN_C__)
  127.     {
  128.       char cmd[80];
  129.       sprintf(cmd, "prload -j %x ", addr);
  130.  
  131.       if (portspecified) {
  132.     strcat (cmd, "-p ");
  133.     strcat (cmd, portspecified);
  134.     strcat (cmd, " ");
  135.       }
  136.  
  137.       strcat (cmd, prg);
  138.  
  139.       fprintf (stderr, "%s\n", cmd);
  140.       system(cmd);
  141.     }
  142. #else
  143.     {
  144.       char saddr[10];
  145.       sprintf(saddr, "%x", addr);
  146.       vmain (main_prload, 4, "prload", "-j", saddr,
  147.          portspecified ? "-p", portspecified, prg, NULL : prg, NULL);
  148.     }
  149. #endif
  150.   }
  151.  
  152.   if (prinit()) {
  153.     fprintf (stderr, "%s: Could not get the I/O permissions.\n", *argv);
  154.     return 1;
  155.   }
  156.  
  157.   if (wait_input ()) {
  158.     fprintf (stderr, "%s: not ready to transfer\n", *argv);
  159.     return 6;
  160.   }
  161.   else
  162.     fprintf (stderr, "%s: ok to transfer\n", *argv);
  163.  
  164.   byte = strlen(remotefile);
  165.   output(byte);
  166.   send(remotefile, byte);
  167.   output(device);
  168.  
  169.   if ((byte = wait_input ()) != 0) {
  170.     fprintf (stderr, "%s: file error %d\n", *argv, byte);
  171.     return 1;
  172.   }
  173.   fprintf(stderr, "Writing %s to %s...\n", localfile, remotefile);
  174.  
  175.   /* loop to send all file blocks */
  176.   for (;;) {
  177.     int length;
  178.     int chksum;
  179.     int i;
  180.  
  181.     length = fread(buffer + 1, 1, 255, file);
  182.  
  183.     chksum = 0;
  184.     for (i = 0; i < length; i++) {
  185.       chksum += buffer[1 + i];
  186.     }
  187.     buffer[0] = chksum;
  188.  
  189.     for (;;) {
  190.       output(length);
  191.  
  192.       if (length == 0)
  193.     break;          /* end of file */
  194.  
  195.       send(buffer, length + 1);
  196.  
  197.       i = wait_input();
  198.  
  199.       switch (i) {
  200.       case 0x80:
  201.     goto nextblock;
  202.       case 0x81:
  203.     fprintf(stderr, "checksum error, resending...\n");
  204.     break;
  205.       default:
  206.     fprintf(stderr, "Aborting\n");
  207.     goto abort;
  208.       }
  209.     }
  210.   nextblock:
  211.     if (length == 0)
  212.       break;
  213.   }
  214. abort:
  215.  
  216.   fclose(file);
  217.  
  218.   output(0);    /* terminate remote side */
  219.  
  220.   prclose ();
  221.  
  222.   return 0;
  223. }
  224.  
  225.